package cl.tinet.trainee.proyecto.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import cl.tinet.trainee.proyecto.ejb.InterfazBeanGenerico;
import cl.tinet.trainee.proyecto.excepciones.ObjetoDuplicadoException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoNoEncontradoException;
import cl.tinet.trainee.proyecto.modelo.Sala;

/**
 * Managed Bean que maneja la informacion de las salas que proviene desde la
 * capa web y la redirecciona a los metodos necesarios.
 * 
 * @author Jose Palma
 * 
 */
@ManagedBean
@ViewScoped
public class SalaManagedBean implements Serializable {
    /**
     * Version 1.0.
     */
    private static final long serialVersionUID = 1L;

    /**
     * 
     */
    private String message;

    /**
     * Log de la clase.
     */
    private static final Logger LOG = Logger.getLogger(SalaManagedBean.class);

    /**
     * Bean de sala.
     */
    @EJB(mappedName = "salaBean", name = "salaBean")
    private transient InterfazBeanGenerico<Sala> bean;

    /**
     * Sala temporal intercambiar datos con las vistas.
     */
    private Sala sala;

    /**
     * Genera una nueva sala despues de llamar al constructor.
     */
    @PostConstruct
    public void init() {
        if (this.sala == null) {
            this.sala = new Sala();
        }
    }

    /**
     * Allows to get the sala attribute value.
     * 
     * @return the sala value.
     */
    public Sala getSala() {
        return sala;
    }

    /**
     * Allows to set the sala attribute value.
     * 
     * @param sala
     *            new value for sala attribute.
     */
    public void setSala(Sala sala) {
        this.sala = sala;
    }

    /**
     * Recibe una sala creada en la capa web y la agrega a la base de
     * datos.
     * 
     * @return El valor de retorno indica la pagina a la que redirecciona el
     *         metodo, en este caso la pagina index.
     */
    public String agregar() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            bean.agregar(sala);
            context.addMessage(null,
                    new FacesMessage("Exito", "Sala agregada."));
            RequestContext.getCurrentInstance().execute(
                    "PF('dAgregarSala').hide()");
        } catch (ObjetoDuplicadoException e) {
            context.addMessage(null,
                    new FacesMessage("Error", "Alerta " + e.getCodigo()));
            return "salas";
        }
        return "index";
    }

    /**
     * Envia la sala al bean y la elimina de la base de datos.
     * 
     * @param salaABorrar
     *            Sala a eliminar.
     * @return El valor de retorno indica la pagina a la que redirecciona el
     *         metodo, en este caso la pagina borrar.
     */
    public String borrar(Sala salaABorrar) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            bean.borrar(salaABorrar);
            saveMessage("Sala Eliminada");
        } catch (ObjetoNoEncontradoException e) {
            LOG.error("borrarSalaMB: ", e);
            context.addMessage(null,
                    new FacesMessage("Error", "Alerta " + e.getCodigo()));
        }

        return "salas";
    }

    /**
     * 
     * Actualiza la sala y refresca la vista.
     * 
     * @param salaAActalizar
     *            sala modificada.
     */
    public void actualizarSala(Sala salaAActalizar) {
        this.sala = salaAActalizar;
        org.primefaces.context.RequestContext.getCurrentInstance().update(
                "fModificarSala:pModificarSala");
    }

    /**
     * Envia una sala al bean y la actualiza de la base de datos.
     * 
     * @return El valor de retorno indica la pagina a la que redirecciona el
     *         metodo, en este caso la pagina actualizar.
     */
    public String actualizar() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            bean.actualizar(sala);
            saveMessage("Sala Modificada");
            RequestContext.getCurrentInstance().execute(
                    "PF('dModificarSala').hide()");

        } catch (ObjetoNoEncontradoException e) {
            LOG.error("actualizarSalaMB: ", e);
            context.addMessage(null, new FacesMessage("Exito", "Alerta: "
                    + "Sala no existe"));
        }
        return "salas";
    }

    /**
     * Metodo que retorna la lista de todas las salas.
     * 
     * @return Retorna una lista con todas las salas que se encuentran en la
     *         base de datos.
     */
    public List<Sala> listar() {
        ArrayList<Sala> salas = bean.listar();
        return salas;
    }

    /**
     * 
     * Growl.
     * 
     * @param msg
     *            String.
     */
    public void saveMessage(String msg) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Your message: "
                + msg));
    }

    /**
     * Allows to get the message attribute value.
     * 
     * @return the message value.
     */
    public String getMessage() {
        return message;
    }

    /**
     * Allows to set the message attribute value.
     * 
     * @param message
     *            new value for message attribute.
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * Genera una nueva instancia de sala.
     * 
     */
    public void limpiar() {
        this.sala = new Sala();
    }
}
